package com.oceantrader.root.tools;

import java.util.List;

import com.oceantrader.root.tools.SqlLoader.SQL;

import io.vertx.core.Future;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * 数据库访问工具
 * 
 * @author xuesinuo
 */
public interface Dao2 {
    /** 事务 */
    @Getter
    @RequiredArgsConstructor
    public static class Transaction {
        private final io.vertx.sqlclient.SqlConnection vertxConnection;
        private final io.vertx.sqlclient.Transaction vertxTransaction;
    }

    /** 开启一个事务 */
    public Future<Transaction> getTransaction();

    /** 开启一个非事务链接 */
    public Future<Transaction> getConnection();

    /** 新增，并返回自增主键 */
    public <T> Future<Long> insert(Future<Transaction> transactionFuture, SQL sql);

    /** 单条DML语句：增、删、改。返回受影响行数 */
    public <T> Future<Integer> update(Future<Transaction> transactionFuture, SQL sql);

    /** 查询List */
    public <T> Future<List<T>> selectList(Future<Transaction> transactionFuture, SQL sql, Class<T> resultClass);

    /** 查询Item */
    public <T> Future<T> selectOne(Future<Transaction> transactionFuture, SQL sql, Class<T> resultClass);

    /** 单查询一个Column */
    public <T> Future<T> selectOneColumn(Future<Transaction> transactionFuture, SQL sql, Class<T> resultClass);

    /** 提交一个事务 */
    public Future<Transaction> commit(Future<Transaction> transactionFuture);

    /** 回滚一个事务 */
    public Future<Transaction> rollback(Future<Transaction> transactionFuture);
}
